package br.com.cast.UseCaseProdutos.produto.paginas;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.validation.validator.StringValidator;

import br.com.cast.UseCaseProdutos.HomePage;
import br.com.cast.UseCaseProdutos.excecoes.ProdutoJaCadastrado;
import br.com.cast.UseCaseProdutos.models.Produto;
import br.com.cast.UseCaseProdutos.services.IProdutoService;
import br.com.cast.UseCaseProdutos.util.ComponentUtil;

public class FormProduto extends Form<Produto> {

	private static final long serialVersionUID = 1L;

	@SpringBean
	private IProdutoService produtoService;

	public FormProduto(String id) {
		super(id, new CompoundPropertyModel<Produto>(new Produto()));

		criaCampoDescricao();

		criaCampoValor();

		criaLinkSalvar();

		criaLinkCancelar();
	}

	private void criaLinkSalvar() {
		add(new AjaxButton("salvar") {
			private static final long serialVersionUID = 1L;

			@Override
			protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
				HomePage template = ComponentUtil.getTemplate(this);

				try {
					produtoService.salvar(FormProduto.this.getModelObject());
					redirecionaListar(target, template);
					template.success("Registro inserido com sucesso!");
				} catch (ProdutoJaCadastrado e) {
					error(e.getMessage());
				}

				target.add(template.get("msgErro"));
				target.add(template.get("msgSucesso"));

			}

			@Override
			protected void onError(AjaxRequestTarget target, Form<?> form) {
				HomePage template = ComponentUtil.getTemplate(this);
				target.add(template.get("msgErro"));
				target.add(template.get("msgSucesso"));
			}

		});

	}

	@SuppressWarnings("rawtypes")
	private void criaLinkCancelar() {
		add(new AjaxLink("cancelar") {
			private static final long serialVersionUID = 1L;

			@Override
			public void onClick(AjaxRequestTarget target) {
				HomePage template = ComponentUtil.getTemplate(this);
				redirecionaListar(target, template);
			}
		});
	}

	private void criaCampoValor() {
		add(new RequiredTextField<>("valor"));
	}

	private void criaCampoDescricao() {
		add(new RequiredTextField<>("descricao")
				.add(new StringValidator(0, 50)));
	}

	private void redirecionaListar(AjaxRequestTarget target, HomePage template) {
		ListarProduto listar = new ListarProduto(HomePage.ID_CONTEUDO);
		template.replace(listar);
		target.add(listar);
	}
}
